import 'dart:math';

import 'package:flutter/material.dart';
import 'package:whale/helper/utils/util.dart';
import 'package:whale/pages/im/im/index.dart';
import 'package:whale/pages/im/util/image.dart';

typedef EmojiCallback = void Function(Map<String, String> emoji);

class ImInputExpressionState {
  late Map<String, String> data;
  late List<String> names;
  late List<String> items;
  List<String>? lastNames;
  List<String>? lastItems;
}

extension IMExpressionData on ImState {
  List<String> get emojiNames {
    return [
      "[微笑]",
      "[撇嘴]",
      "[色]",
      "[发呆]",
      "[得意]",
      "[流泪]",
      "[害羞]",
      "[闭嘴]",
      "[睡]",
      "[大哭]",
      "[尴尬]",
      "[发怒]",
      "[调皮]",
      "[呲牙]",
      "[惊讶]",
      "[难过]",
      "[囧]",
      "[抓狂]",
      "[吐]",
      "[偷笑]",
      "[愉快]",
      "[白眼]",
      "[傲慢]",
      "[困]",
      "[惊恐]",
      "[流汗]",
      "[憨笑]",
      "[悠闲]",
      "[奋斗]",
      "[咒骂]",
      "[疑问]",
      "[嘘]",
      "[晕]",
      "[衰]",
      "[骷髅]",
      "[敲打]",
      "[再见]",
      "[擦汗]",
      "[抠鼻]",
      "[鼓掌]",
      "[坏笑]",
      "[左哼哼]",
      "[右哼哼]",
      "[哈欠]",
      "[鄙视]",
      "[委屈]",
      "[快哭了]",
      "[阴险]",
      "[亲亲]",
      "[可怜]",
      "[菜刀]",
      "[西瓜]",
      "[啤酒]",
      "[咖啡]",
      "[猪头]",
      "[玫瑰]",
      "[凋谢]",
      "[嘴唇]",
      "[爱心]",
      "[心碎]",
      "[蛋糕]",
      "[炸弹]",
      "[便便]",
      "[月亮]",
      "[太阳]",
      "[拥抱]",
      "[强]",
      "[弱]",
      "[握手]",
      "[胜利]",
      "[抱拳]",
      "[勾引]",
      "[拳头]",
      "[OK]",
      "[跳跳]",
      "[发抖]",
      "[怄火]",
      "[转圈]",
      "[嘿哈]",
      "[捂脸]",
      "[奸笑]",
      "[机智]",
      "[皱眉]",
      "[耶]",
      "[蜡烛]",
      "[红包]",
      "[吃瓜]",
      "[加油]",
      "[汗]",
      "[天啊]",
      "[Emm]",
      "[社会社会]",
      "[旺柴]",
      "[好的]",
      "[打脸]",
      "[加油加油]",
      "[哇]",
      "[發]",
      "[福]",
      "[鸡]",
    ];
  }

  Map<String, String> get emojiData {
    return {
      "[微笑]": "im_emjoi_hehe.png",
      "[撇嘴]": "im_emjoi_piezui.png",
      "[色]": "im_emjoi_se.png",
      "[发呆]": "im_emjoi_fadai.png",
      "[得意]": "im_emjoi_deyi.png",
      "[流泪]": "im_emjoi_liulei.png",
      "[害羞]": "im_emjoi_haixiu.png",
      "[闭嘴]": "im_emjoi_bizui.png",
      "[睡]": "im_emjoi_shui.png",
      "[大哭]": "im_emjoi_daku.png",
      "[尴尬]": "im_emjoi_ganga.png",
      "[发怒]": "im_emjoi_fanu.png",
      "[调皮]": "im_emjoi_tiaopi.png",
      "[呲牙]": "im_emjoi_ciya.png",
      "[惊讶]": "im_emjoi_jingya.png",
      "[难过]": "im_emjoi_nanguo.png",
      "[囧]": "im_emjoi_jiong.png",
      "[抓狂]": "im_emjoi_zhuakuang.png",
      "[吐]": "im_emjoi_tu.png",
      "[偷笑]": "im_emjoi_touxiao.png",
      "[愉快]": "im_emjoi_yukuai.png",
      "[白眼]": "im_emjoi_baiyan.png",
      "[傲慢]": "im_emjoi_aoman.png",
      "[困]": "im_emjoi_kun.png",
      "[惊恐]": "im_emjoi_jingkong.png",
      "[流汗]": "im_emjoi_liuhan.png",
      "[憨笑]": "im_emjoi_hanxiao.png",
      "[悠闲]": "im_emjoi_youxian.png",
      "[奋斗]": "im_emjoi_fendou.png",
      "[咒骂]": "im_emjoi_zhouma.png",
      "[疑问]": "im_emjoi_yiwen.png",
      "[嘘]": "im_emjoi_xu.png",
      "[晕]": "im_emjoi_yun.png",
      "[衰]": "im_emjoi_sui.png",
      "[骷髅]": "im_emjoi_kulou.png",
      "[敲打]": "im_emjoi_qiaoda.png",
      "[再见]": "im_emjoi_zaininmadejian.png",
      "[擦汗]": "im_emjoi_cahan.png",
      "[抠鼻]": "im_emjoi_koubi.png",
      "[鼓掌]": "im_emjoi_guzhang.png",
      "[坏笑]": "im_emjoi_huaixiao.png",
      "[左哼哼]": "im_emjoi_zuohengheng.png",
      "[右哼哼]": "im_emjoi_youhengheng.png",
      "[哈欠]": "im_emjoi_haqian.png",
      "[鄙视]": "im_emjoi_bishi.png",
      "[委屈]": "im_emjoi_weiqu.png",
      "[快哭了]": "im_emjoi_kuaikule.png",
      "[阴险]": "im_emjoi_yinxian.png",
      "[亲亲]": "im_emjoi_qinqin.png",
      "[可怜]": "im_emjoi_kelian.png",
      "[菜刀]": "im_emjoi_caidao.png",
      "[西瓜]": "im_emjoi_xigua.png",
      "[啤酒]": "im_emjoi_pijiu.png",
      "[咖啡]": "im_emjoi_kafei.png",
      "[猪头]": "im_emjoi_zhutou.png",
      "[玫瑰]": "im_emjoi_meigui.png",
      "[凋谢]": "im_emjoi_diaoxie.png",
      "[嘴唇]": "im_emjoi_zuichun.png",
      "[爱心]": "im_emjoi_aixin.png",
      "[心碎]": "im_emjoi_xinsui.png",
      "[蛋糕]": "im_emjoi_dangao.png",
      "[炸弹]": "im_emjoi_zhadan.png",
      "[便便]": "im_emjoi_bianbian.png",
      "[月亮]": "im_emjoi_yueliang.png",
      "[太阳]": "im_emjoi_taiyang.png",
      "[拥抱]": "im_emjoi_yongbao.png",
      "[强]": "im_emjoi_qiang.png",
      "[弱]": "im_emjoi_ruo.png",
      "[握手]": "im_emjoi_woshou.png",
      "[胜利]": "im_emjoi_shengli.png",
      "[抱拳]": "im_emjoi_baoquan.png",
      "[勾引]": "im_emjoi_gouyin.png",
      "[拳头]": "im_emjoi_quantou.png",
      "[OK]": "im_emjoi_ok.png",
      "[跳跳]": "im_emjoi_tiaotiao.png",
      "[发抖]": "im_emjoi_fadou.png",
      "[怄火]": "im_emjoi_ohuo.png",
      "[转圈]": "im_emjoi_zhuanquan.png",
      "[嘿哈]": "im_emjoi_heiha.png",
      "[捂脸]": "im_emjoi_wulian.png",
      "[奸笑]": "im_emjoi_jianxiao.png",
      "[机智]": "im_emjoi_jizhi.png",
      "[皱眉]": "im_emjoi_zhoumei.png",
      "[耶]": "im_emjoi_ye.png",
      "[蜡烛]": "im_emjoi_lazhu.png",
      "[红包]": "im_emjoi_hongbao.png",
      "[吃瓜]": "im_emjoi_chigua.png",
      "[加油]": "im_emjoi_jiayou.png",
      "[汗]": "im_emjoi_han.png",
      "[天啊]": "im_emjoi_tiana.png",
      "[Emm]": "im_emjoi_emm.png",
      "[社会社会]": "im_emjoi_shehuishehui.png",
      "[旺柴]": "im_emjoi_wangchai.png",
      "[好的]": "im_emjoi_haode.png",
      "[打脸]": "im_emjoi_dalian.png",
      "[加油加油]": "im_emjoi_jiayoujiayou.png",
      "[哇]": "im_emjoi_wa.png",
      "[發]": "im_emjoi_fa.png",
      "[福]": "im_emjoi_fu.png",
      "[鸡]": "im_emjoi_ji.png",
    };
  }

  List<InlineSpan> getEmojiText(String s) {
    TextSpan getText(String t) {
      return TextSpan(
        text: t,
        style: TextStyle(
          color: const Color(0xff333333),
          fontSize: 15.sp,
        ),
      );
    }

    if (!s.contains(']') || !s.contains(']')) {
      return [getText(s)];
    }
    final emojiState = Get.find<ImController>().state;
    List<InlineSpan> list = [];
    var b = -1;
    var text = '';
    for (var i = 0; i < s.characters.length; i++) {
      var c = s.characters.elementAt(i);
      if (b >= i) {
        continue;
      }

      if (c == '[') {
        b = -1;
        var end = min(s.length - i, emojiState.maxEmojiNameLength);
        if (end <= 0) {
          text += c;
          continue;
        }
        var m = s.substring(i, i + end);

        var ee = m.indexOf(']');
        if (ee <= 0) {
          text += c;
          continue;
        }
        var e = m.substring(0, ee + 1);
        if (emojiNames.contains(e)) {
          b = ee + i;
          if (text.isNotEmpty) {
            list.add(getText(text));
          }

          list.add(WidgetSpan(
              child: Image.asset(
            emojiData[e]!.imImgPathExpression,
            width: 20.sp,
          )));
          text = '';
        } else {
          text += c;
        }
      } else {
        text += c;
        if (i == s.characters.length - 1) {
          list.add(getText(text));
        }
      }
    }

    return list;
  }
}
